home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 3: Developer Tools / Linux Cubed Series 3 - Developer Tools.iso / utils / console / svgatext.3 / svgatext / SVGATextMode-1.3 / doc / README.ET4000.AltClockSelect < prev    next >
Encoding:
Text File  |  1995-10-07  |  19.9 KB  |  475 lines

  1.  
  2.  
  3. Some ET4000 (W32?) cards don't work correctly with the the normal X-Windows
  4. Server (XF86_SVGA), and hence also not with the default ET4000 clock
  5. selection code in SVGATextMode (it was based on the XFREE method, so it'll
  6. go wrong wherever XFREE goes wrong...).
  7.  
  8. On those cards, you seem to be unable to use the higher pixel clocks,
  9. altough they ARE available from the MSWindows (alias WinTendo ;-) drivers. 
  10.  
  11. It took me a long time to figure out what exactly caused this. Following is
  12. a rather technical discussion of the causes of this. If you're not all that
  13. technical, don't bother to read on. It's just here for the curious, and for
  14. the XFREE programmers...
  15.  
  16. It should suffice to know that you CAN use the "ET4000_AltClockSel" option
  17. to use an alternative clock selection method, giving you access to all
  18. available clocks.
  19.  
  20. The bottom line of all this is:
  21.  
  22. Those unhappy few with a "bad" (*) ET4000 card (i.e. one that only works PARTLY
  23. under X-Windows) could get it to work a lot better in X-Windows (i.e. like
  24. the "good" ET4000 cards) by using an external clock program, which DOES
  25. select the clocks correctly. One such program was written by Roland Meier
  26. (meier@hp56.rbg.informatik.th-darmstadt.de). 
  27.  
  28. Of xourse, you need to know the CORRECT clocks. And the "X -probeonly" trick
  29. will NOT work this time! Use the clocks reported by the DOS utility
  30. "dmode.exe" which is included with most ET4000 boards. It has a clock probe
  31. on board, much like the one in the XFREE code, but this time correct...
  32.  
  33. (*) These cards are as good as the other ET4000's, they just don't work
  34. completely with the X-server. So in fact the X-server is "bad", and not the
  35. card!
  36.  
  37.  
  38. ==============================================================================
  39. If you're interested in technical details, read on. Otherwise, ... well, don't
  40. ==============================================================================
  41.  
  42. I've been able to test such a card extensively, and it seems the XFREE code
  43. gets some things wrong in addition to the clock selection code. If you want
  44. a better (less buggy) server, look for XF86_W32_gendac.tar.gz on
  45. sunsite.unc.edu.
  46.  
  47. "X -probeonly" (with an XF86Config file WITHOUT Clocks line, and WITHOUT
  48. chipset line in it), reports the following:
  49.  
  50.  
  51.    XFree86 Version 3.1 / X Window System
  52.  
  53.    [...]
  54.  
  55.    (--) SVGA: chipset:  et4000w32p
  56.    (--) SVGA: videoram: 1024k
  57.    (--) SVGA: clocks:  25.44  28.32  31.59  37.34  40.26  45.05  50.12  65.28
  58.    (--) SVGA: clocks:  12.85  14.17  15.80  18.07  20.05  23.04  25.04  32.65
  59.    (**) SVGA: Option "hibit_low"
  60.  
  61.  
  62. This was executed from a 80x60 text mode (this is important. the current
  63. pixel clock determines the result!), which uses the same standard VGA clock
  64. of 25 or 28 MHz, as in 80x25 or any other standard 80x.. mode.
  65.  
  66.  
  67. The accelerated W32 server reports the following:
  68.  
  69.    XFree86 Version 3.1 / X Window System
  70.    (protocol Version 11, revision 0, vendor release 6000)
  71.    Operating System: Linux
  72.    Configured drivers:
  73.      ET4000W32: accelerated server for ET4000W32 graphics adaptors (Patchlevel
  74.    0):
  75.          et4000w32, et4000w32i, et4000w32p_rev_a, et4000w32i_rev_b,
  76.          et4000w32i_rev_c, et4000w32p_rev_b, et4000w32p_rev_c,
  77.          et4000w32p_rev_d
  78.  
  79.    [...]
  80.    (--) ET4000W32: chipset:  et4000w32i_rev_b
  81.    (--) ET4000W32: videoram: 1023k
  82.    (--) ET4000W32: clocks:  25.37  28.32  31.58  38.21  41.79  45.23  50.10
  83.    65.32
  84.    (--) ET4000W32: clocks:  12.66  14.16  16.00  18.08  20.07  22.54  26.25
  85.    33.68
  86.  
  87. Both seem to use the same pixel clock selection, and both are getting it
  88. wrong...
  89.  
  90. Because I happen to know that the REAL pixel clocks are:
  91.  
  92.   25.1 28.3 32.5 36 40 44.9 50 65 50 56.6 65 72 80 90 63 75
  93.  
  94. This can be evidenced from two different sources.
  95.  
  96. First of all, SVGATextMode, when givven these clocks, and the option
  97. "ET4000_AltClockSel", can use ALL above clocks, and produces the right
  98. display (I should know, since my monitor will only take 32 and 56 kHz. Any
  99. other frequency and it won't lock...). Clockprobe also reports that the REAL
  100. clock corresponds with the one in the Clocks line. 
  101.  
  102. And secondly, a DOS tool that came with the card (dmode.exe) also has some
  103. kind of clock probing function on board. It reports the SAME 16 possible
  104. pixel clocks (although in a different order: the upper 8 are swapped with
  105. the lower 8).
  106.  
  107. ---------------------------------------------------------------------------
  108.  
  109. Tseng Labs has been so kind as to send me an ET4000W32i data book. I looked
  110. up some things. Together with a lenghty E-mail discussion with Roland Meier
  111. (meier@hp56.rbg.informatik.th-darmstadt.de), I came up with the following
  112. theory (it has been confirmed by my own experiences, and the ones from
  113. Roland Meier, the author of the clock program for the "bad" Et4000's).
  114.  
  115. First of all: the ET4000 chip has 5 dedicated clock selection bits in its
  116. coniguration registers (CS0..CS4) which can be used to drive an external
  117. clock synthesizer chip. In addition to that, it also has a bit to divide the
  118. clock by 2 (MCLK/2) and one to divide it by 4 (MCLK/4).
  119.  
  120. Most ET4000 cards (i.e. the ones that work 100% with the XFREE code) use the
  121. three lowest clock selection bits, in combination with the "divide-by-two"
  122. bit as the fourth clock selection bit. This mean they use the following 4
  123. bits to select clocks:
  124.  
  125.        CS0  CS1  CS2  MCLK/2   (from lowest to most significant bit)
  126.  
  127.   bit:  0    1    2     3
  128.  
  129. The number of the clock you ask for (from 0 to 15) is put in these 4 bits.
  130.  
  131. You might also have noted the "hibit_high" or "hibit_low" option. This
  132. option tells the XFREE code (and also SVGATextMode) what the status of the
  133. 4th bit (MCLK/2 in this case) is when you select one of the 8 first clocks
  134. from the clocks line. These mostly are the lowest available clocks.
  135.  
  136. "hibit_low" means MCLK/2 must be low for the lower 8 clocks. "Hibit_high"
  137. the opposite: MCLK/2 must be high for the lower 4 clocks.
  138.  
  139. But since MCLK/2 is in fact a programmable "divide-the-pixelclock-by-2" bit,
  140. this means that you are IN FACT only using 8 "real" clocks, and the other 8
  141. are just the same clocks divided by 2! You can check that in the "normal"
  142. clocks line for a standard ET4000 card (this time split into 2 lines to
  143. make things more clear):
  144.  
  145.    Clocks  25.1 28.3   32.5 36   40   44.9 31.5 37.6
  146.    Clocks  50   56.6   65   72   80   90   63   75
  147.  
  148. The second clocks line contains each time the double clock as the one above
  149. it (the first clock line).
  150.  
  151. Remember we are still talking about the "normal" ET4000 cards.
  152.  
  153. But what are they then doing with those upper 2 (real) clock selection bits
  154. CS3 and CS4? The answer: NOTHING! They are not used in the XFREE code. 
  155.  
  156. Now there are two possibilities: either the clock chip used in many ET4000's
  157. can only generate 8 clocks (high clocks, as in the second clocks line
  158. above), and you then have to use the MCLK/2 bit to get the lower clocks
  159. (like the VGA standard 25 and 28 MHz clocks). Or you have a clock chip that
  160. can generate 16 clocks, but XFREE only uses 8, because of the way they do
  161. clock selection.
  162.  
  163. In the second case, you only use half of the available clocks! Which would
  164. mean that using e.g. CS3 would give you ANOTHER bank of 8 clocks. Remember
  165. XFREE doesn't use this bit.
  166.  
  167. Now take a look into the output from X -probeonly above for the "bad" ET4000
  168. card. The FIRST row of clocks is a normal sequence starting with 25 and 28
  169. MHz. But the SECOND row are HALF of the clocks above:
  170.  
  171.    (--) SVGA: clocks:  25.44  28.32  31.59  37.34  40.26  45.05  50.12  65.28
  172.    (--) SVGA: clocks:  12.85  14.17  15.80  18.07  20.05  23.04  25.04  32.65
  173.  
  174. So here you see the effect of the MCLK/2 bit used as clock selection bit 3
  175. again, but this time with the effect that the second row are HALF the clocks
  176. of the one above, instead of DOUBLE. The bottom row of clocks is completely
  177. useless for all "normal" graphics modes, since you need HIGH clocks, not LOW
  178. ones. So you can only really use the upper row of 8 clocks.
  179.  
  180. This means your ET4000 card WILL work with XFREE, but only at 800x600 @ 70
  181. Hz and 1024x768 @ 60 Hz (Max clock = 65 MHz).
  182.  
  183. That is a waste of hardware, since an ET4000 can easily handle 86 MHz (and
  184. above) to give you the best possible refresh rates - if your monitor can
  185. handle them.
  186.  
  187. Note that the 8 lower clocks from X -probeonly are exactly the same as the 8
  188. lower clocks in the CORRECT clocks line:
  189.  
  190.   25.1 28.3 32.5 36 40 44.9 50 65 50 56.6 65 72 80 90 63 75
  191.   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  192.  
  193. Which again proves that XFREE uses a divide-by-2 feature to get the "upper"
  194. 8 clocks. And thus never gets access to the REAL upper 8 clocks that this
  195. "bad" card needs!
  196.  
  197. So, what would X -probeonly tell us when the REAL 4th clock select bit is
  198. changed? If I am correct, it should now give us the other 8 clocks from my
  199. CORRECT clocks line:
  200.  
  201.   25.1 28.3 32.5 36 40 44.9 50 65 50 56.6 65 72 80 90 63 75
  202.                                   ^^^^^^^^^^^^^^^^^^^^^^^^^
  203.                                   
  204. And the other 8 would then be those 8 divided by 2.
  205.  
  206. Using setVGAreg from SVGATextMode, I set the REAL CS3 bit, and do X
  207. -probeonly to let the X-server probe the clocks. Since X doesn't touch this
  208. bit, I can easily change it, and then run X -probeonly again to see if it
  209. comes up with anything else. If nothing changes, that would mean the
  210. hardware does not use that CS3 bit, and that there are only 8 clocks
  211. available to this ET4000. And that would be the end of it...
  212.  
  213.  
  214. Let's see:
  215. (we do all this from the standard VGA 80x25 mode)
  216.  
  217.    > ./getVGAreg CRTC 0x31
  218.    VGA 'CRTC' register, index 49 (=0x31) contains 64 (=0x40)
  219.  
  220. bits 7 and 6 are CS4 and CS3 resp., which means clock select bit 3 (CS3) is
  221. ON!!! This means this bit must be ON for the LOWER 8 clocks to be selected.
  222. So we'll now put it OFF, and see what the X clock probe thinks:
  223.  
  224.    > ./setVGAreg CRTC 0x31 0x00
  225.    VGA 'CRTC' register, index 49 (=0x31) contains 0 (=0x00)
  226.  
  227. (at this time we should be running with clock 9 instead of clock 1 (i.e.
  228. 56.6 MHz). The monitor goes out of sync. clockprobe confirms that we ARE at
  229. 56 MHz)
  230.  
  231.    > X -probeonly
  232.    (--) ET4000W32: clocks:  25.28  28.32  32.68  36.42  40.18  45.22  31.63  37.81
  233.    (--) ET4000W32: clocks:  12.63  14.18  16.33  18.11  20.10  22.58  15.79  18.90
  234.  
  235. These ARE different from our first probe attempt (without CS3 changed). So
  236. it REALLY does something, although X doesn't use it!
  237.    
  238. These are the second block of 8 clocks, but already divided by 2, and
  239. then divided by 2 again to get the second row from the probe...
  240.  
  241. The reason for this is explained below in the "very important note" on the
  242. XFREE clock probe. The XFREE probe always assumes clock #1 is 28 MHz, and
  243. scales the others accordingly. In this case, this is wrong: clock #1 is
  244. actually 56 MHz, and thus we need to scale all the others back up: 
  245.  
  246.    (--) ET4000W32: clocks:  50.56  56.64  65.36  72.84  80.36  90.44  63.26  75.62
  247.    (--) ET4000W32: clocks:  25.28  28.32  32.68  36.42  40.18  45.22  31.63  37.81
  248.  
  249. And This shows that indeed changing CS3 DOES give us another pack of 8
  250. clocks, and this time up to 90 MHz (like almost all ET4000's).
  251.  
  252. ---------------------------------------------------------------------------------
  253.  
  254. Those unhappy few with a "bad" ET4000 card (i.e. one that only works PARTLY
  255. under X-Windows) could get it to work a lot better in X-Windows (i.e. like
  256. the "good" ET4000 cards) by just replacing the "X" symbolic link in
  257. /usr/bin/X11 with the following script:
  258.                                                                             
  259.   #!/bin/bash
  260.   ORIG31=`/sbin/getVGAreg -up CRTC 0x31`
  261.   echo Original CRTC reg 0x31 contents: $ORIG31
  262.   /sbin/setVGAreg -u CRTC 0x31 0x00  # <-----
  263.   /usr/bin/X11/XF86_SVGA  /sbin/setVGAreg -u CRTC 0x31 $ORIG31
  264.   
  265. Change this script so it suits YOUR system setup. You could also change the
  266. line with the '<----' arrow to '0x40' instead of '0x00'. Each choice will
  267. give you another set of pixel clocks. Don't forget to run 'X -probeonly'
  268. when you change the script, because you'll get other pixel clocks.
  269.  
  270. This is a bad, and probably too much "hacker-like" patch. The better
  271. solution is the external clock program (see at the beginning of this file)
  272.  
  273.  
  274. ---------------------------------------------------------------------------------
  275.  
  276.  
  277. CONCLUSION:
  278. -----------
  279.  
  280. The XFREE code should change its clock selection to ALWAYS use CS0, CS1, CS2
  281. AND (!) CS3 (and maybe even CS4) for ALL Et4000 boards, and output all the
  282. clocks it can get from THAT clock selection method. It could then go on to
  283. suggest all clocks divided by 2 as 16 MORE clocks (resulting in 32 clocks
  284. for most ET4000 owners).
  285.  
  286. The XFREE ATI VGA card driver already does that: it suggests 16 "basic"
  287. clocks, and all those divided by 2, 3 and 4 (ATI cards can do this),
  288. resulting in 64 clocks from X -probeonly.
  289.  
  290. ET4000 cards only support division by 2 and 4, thus allowing a maximum of
  291. 3*32 = 96 clocks (most ET4000 cards have a clock chip that has only 16
  292. clocks, so the total would in fact be limited to 3*16=48 possible clocks).
  293.  
  294. But in order to probe the CORRECT clocks, it must AT LEAST do ONE absolute
  295. measurement on one of the clocks (e.g. using the method from the SVGATextMode
  296. clock probe).
  297.  
  298. This method would be independent of the polarity of certain clock selection
  299. bits (affected by the "hibit_..." option in the current version of the XFREE
  300. ET4000 clock selection code). The only "drawback" of this would be that some
  301. cards would have high pixel clocks as the first ones, and low clocks at the
  302. end. But I don't really see a problem there.
  303.  
  304. Using the method described above, would have the following benefits:
  305.  
  306.  - ET4000 cards would now use ALL available pixel clocks, instead of just 8
  307.    (doubled to 16 by that division by 2 bit MCLK/2). Even the cards that
  308.    already worked with the XFREE server would benefit from that: they'd get
  309.    more pixel clocks.
  310.  - The unhappy few that had a card incompatible with the XFREE clock
  311.    selection method would now be able to use their card fully.
  312.  - No more fiddling with a "hibit" option needed. That option would become
  313.    obsolete. Unless you want to keep it in order to be able to get the lower
  314.    clocks in the first positions (e.g. to get the 25 and 28 MHz back in
  315.    their normal positions). But the option would NOT be needed to get some
  316.    cards to work.
  317.  
  318. Drawback: this method is not "downwards compatible": anyone switching to the
  319. new clock selection method would need to restart X -probeonly, and re-enter
  320. those clocks in his/her XF86Config.
  321.  
  322.  
  323. The XFREE programmers should also consider taking another approach at clock
  324. probing, to avoid equivalent problems as those described below with other
  325. cards.
  326.  
  327.  
  328.  
  329. =================================================================================
  330.  
  331. VERY IMPORTANT NOTE: The XFREE clock probe is WRONG (on some occasions)!!!
  332. ---------------------------------------------------------------------------
  333.  
  334. The xfree clock probe works as follows: it first disables all interrupts,
  335. then selects all clocks one by one and runs a counter for a certain number
  336. of vertical retraces. It stores the counter value for each pixel clock.
  337.  
  338. At the end, the RELATIVE ratio between the 16 counter values are used to
  339. calculate the pixel clock rate.
  340.  
  341. But in order to be able to do that, you need to have a reference: if you
  342. know that clock 1 ran to 1000000 counts during 5 vertical retraces, and
  343. clock 5 needed just 200000, you know clock 5 is 5 times faster than clock 1.
  344. But how fast is that? This method only gives you RELATIVE measurements, and
  345. not absolute!'
  346.  
  347. In order to solve that problem, the XFREE programmers made the mistake
  348. (IMHO) to ASSUME clock number 1 is ALWAYS 28 MHz (it should, for a standard
  349. VGA card: clock0 0 = 25 and clock 1 = 28 MHz).
  350.  
  351. This is all allright, IF AND ONLY IF the clock selection mechanism is
  352. correct. Because any VGA card must indeed have 28 MHz as clock 1. But what
  353. if the clock selection code is WRONG (as in the case of this ET4000 card)?
  354.  
  355. Then you get the results scaled wrong: if the clock selected as #1 by the
  356. XFREE code is e.g. 56 MHz, XFREE will assume it is 28 MHz, and all other
  357. clocks will be scaled accordingly. i.e. they will all be half (since 56 is
  358. twice 28 in our example) their actual value.
  359.  
  360. You can in fact observe this behaviour on ANY ET4000 card, even the ones
  361. that work correctly for XFREE. Suppose the correct clocks (as reported with
  362. X -probeonly) were:
  363.  
  364.    Clocks  25.1 28.3   32.5 36   40   44.9 31.5 37.6
  365.    Clocks  50   56.6   65   72   80   90   63   75
  366.  
  367. Since changing the polarity of the "hibit_..." option swaps the meaning of
  368. what is used as the highest clock selection bit, you'd expect the following
  369. when changing "hibit_...":
  370.  
  371.    Clocks  50   56.6   65   72   80   90   63   75
  372.    Clocks  25.1 28.3   32.5 36   40   44.9 31.5 37.6
  373.  
  374.  
  375. i.e. just swapped the two rows of clocks. BUT XREE ASSUMES clock #1 is 28
  376. MHz, and it now is 56.6 MHz (the REAL, ACTUAL frequency. which
  377. SVGATextMode's clockprobe could show you). So all other clocks will be
  378. scaled down, and X -probeonly will give you:
  379.  
  380.    Clocks  25   28.3  32.5   36   40   45   31.5  37.5
  381.    Clocks  12.6 14.2  16.3   18   20   22.5 15.7  18.7
  382.  
  383.  
  384. Which is wrong, of course!
  385.  
  386.  
  387. The XFREE clock probe uses a pixel clock as the reference to measure .. the
  388. pixel clock! This is correct in ALMOST al cases...
  389.  
  390. It would be MUCH better to use an EXTERNAL reference to do an absolute
  391. measurement on at least ONE pixel clock. One can then always use the
  392. "relative" tehnique to derive all other pixel clocks. 
  393.  
  394. The clockprobe in SVGATextMode uses a system timer to derive the pixel clock
  395. speed, which is a far better (but slower) method (it has its own problems,
  396. though...).
  397.  
  398.  
  399.  
  400. =================================================================================
  401.  
  402. The following patch to /usr/X11/lib/Server/drivers/vga256/et4000/driver.c
  403. (for xfree 2.x) or .../xfree86/vga256/drivers/et4000/et4_driver.c implements
  404. the suggested change to the ET4000 X-server. It's just a first attempt to
  405. demonstrate the principle...
  406.  
  407. It seems to work, but not completely...
  408.  
  409.  
  410. --- driver.c.orig    Sat Feb 25 01:58:15 1995
  411. +++ driver.c    Sat Feb 25 03:00:22 1995
  412. @@ -147,28 +147,47 @@
  413.  ET4000ClockSelect(no)
  414.       int no;
  415.  {
  416. -  static unsigned char save1, save2, save3;
  417. +  static unsigned char save1, save2, save3, saveMCLKdiv;
  418.    unsigned char temp;
  419. +  int opt_32clocks=FALSE;  /* this should be an option from the config file ! */
  420.  
  421.    switch(no)
  422.    {
  423.      case CLK_REG_SAVE:
  424.        save1 = inb(0x3CC);
  425.        outb(vgaIOBase + 4, 0x34); save2 = inb(vgaIOBase + 5);
  426. -      outb(0x3C4, 7); save3 = inb(0x3C5);
  427. +      outb(vgaIOBase + 4, 0x31); save3 = inb(vgaIOBase + 5);
  428. +      outb(0x3C4, 7); saveMCLKdiv = inb(0x3C5);
  429.        break;
  430.      case CLK_REG_RESTORE:
  431.        outb(0x3C2, save1);
  432.        outw(vgaIOBase + 4, 0x34 | (save2 << 8));
  433. -      outw(0x3C4, 7 | (save3 << 8));
  434. +      outw(vgaIOBase + 4, 0x31 | (save3 << 8));
  435. +      outw(0x3C4, 7 | (saveMCLKdiv << 8));
  436.        break;
  437.      default:
  438.        temp = inb(0x3CC);
  439. -      outb(0x3C2, ( temp & 0xf3) | ((no << 2) & 0x0C));
  440. -      outw(vgaIOBase + 4, 0x34 | ((no & 0x04) << 7));
  441. +      outb(0x3C2, ( temp & 0xf3) | ((no << 2) & 0x0C)); /* clock select bit 0 and 1 */
  442. +      outw(vgaIOBase + 4, 0x34 | ((no & 0x04) << 7));  /* clock select bit 2 */
  443.  
  444. +      if (opt_32clocks == TRUE)
  445. +        temp = save_divide ? (no & 0x18) ^ 0x08 : (no & 0x18);
  446. +      else
  447. +        temp = save_divide ? (no & 0x08) ^ 0x08 : (no & 0x08);
  448. +      outw(vgaIOBase + 4, 0x31 | (temp << 11)); /* clock select bit 3 and 4 */
  449. +
  450. +      /* note that MCLK/2 cannot be COMBINED with MCLK/4 ! only one of both can be on */
  451.        outb(0x3C4, 7); temp = inb(0x3C5);
  452. -      outb(0x3C5, (save_divide ^ ((no & 0x08) << 3)) | (temp & 0xBF));
  453. +      switch(no/((opt_32clocks==TRUE) ? 32 : 16))
  454. +      {
  455. +        case 1: temp = (temp & 0xfe) | 0x40;    /* divide clock by 2 (MCLK/2) */
  456. +                break;
  457. +        case 2: temp = (temp & 0xbf) | 0x41;    /* divide clock by 4 (MCLK/4), requires MCLK/2 to be set as well (vgadoc3) */
  458. +                break;
  459. +        case 0:
  460. +        default: temp = temp & 0xbe;                   /* no division */
  461. +      }
  462. +      outb(0x3C5, temp);
  463.    }
  464.    return(TRUE);
  465.  }
  466. @@ -312,7 +331,7 @@
  467.    else
  468.      {
  469.        ClockSelect = ET4000ClockSelect;
  470. -      numClocks   = 16;
  471. +      numClocks   = 48;   /* or 96 when there are 32 "base" clocks */  
  472.      }
  473.    
  474.    if (OFLG_ISSET(OPTION_HIBIT_HIGH, &vga256InfoRec.options))
  475.